// /**
// *      author: Y_Yao
// *      created: 2025-05-06 22:02:10
// **/

// #include<bits/stdc++.h>

// #define int LL
// using namespace std;
// using LL = long long;
// const LL LLINF = 9e18;
// const int INF = 0x3f3f3f3f;
// const int N = 2e5 + 7;
// int fa[N],sz[N];
// int n,m;
// bool flag = false;
// bool flag2 = false;
// unordered_map<int,int> mp;

// int find(int x)
// {
//     return fa[x] == x ? x : fa[x] = find(fa[x]);
// }

// void Union(int u,int v)
// {
//     int rootu = find(u);
//     int rootv = find(v);
//     if(rootv == rootu)
//     {
//         if(sz[rootv] == n && mp[u] == 2 && mp[v] == 2)
//         {
//             cout << "Yes" << endl;
//             exit(0);
//         }
//         else
//         {
//             cout << "No" << endl;
//             exit(0);
//         }
//     }

//     if(sz[rootu] > sz[rootv]) swap(rootu,rootv);
//     fa[rootu] = rootv;
//     sz[rootv] += sz[rootu];
// }

// void solve()
// {
//     cin >> n >> m;
//     if(m != n)
//     {
//         cout << "No" << endl;
//         return;
//     }
//     for(int i = 1;i <= n;i++)
//     {
//         fa[i] = i;
//         sz[i] = 1;
//     }
//     for(int i = 1;i <= m;i++)
//     {
//         int u,v;
//         cin >> u >> v;
//         mp[u]++;
//         mp[v]++;
//         if(mp[u] > 2 || mp[v] > 2)
//         {
//             cout << "No" << endl;
//             return;
//         }
//         Union(u,v);
//     }

//     cout << "No" << endl;
// }

// signed main()
// {
//     ios::sync_with_stdio(false);
//     cin.tie(0);

//     int t = 1;
//     // cin >> t;
//     while(t--)
//     {
//         solve();
//     }
//     return 0;
// }


/**
*      author: Y_Yao
*      created: 2025-05-06 23:57:54
**/

#include<bits/stdc++.h>

#define int LL
using namespace std;
using LL = long long;
const LL LLINF = 9e18;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 7;
int n,m;
unordered_map<int,int> mp;
vector<int> G[N];
bool vis[N];

void dfs(int start,int step)
{
    if(G[start].size() != 2)
    {
        cout << "No" << endl;
        exit(0);
    }

    vis[start] = true;
    if(step == n - 1)
    {
        return;
    }

    if(!vis[G[start][0]])
    {
        dfs(G[start][0],step + 1);
    }
    else if(!vis[G[start][1]])
    {
        dfs(G[start][1],step + 1);
    }
    else
    {
        cout << "No" << endl;
        exit(0);
    }
}

void solve()
{
    cin >> n >> m;
    if(m != n)
    {
        cout << "No" << endl;
        return;
    }

    for(int i = 1;i <= m;i++)
    {
        int u,v;
        cin >> u >> v;
        mp[u]++,mp[v]++;
        if(mp[u] > 2 || mp[v] > 2)
        {
            cout << "No" << endl;
            return;
        }
        G[u].push_back(v);
        G[v].push_back(u);
    }

    dfs(1,0);
    for(int i = 1;i <= n;i++)
    {
        if(vis[i] == false)
        {
            cout << "No" << endl;
            return;
        }
    }
    cout << "Yes" << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    int t = 1;
    // cin >> t;
    while(t--)
    {
        solve();
    }
    return 0;
}